package com.damBowling.mybolos;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

import models.Alquiler;
import models.AlquilerDetalle;
import models.Empleado;
import models.Franja;
import models.Horario;
import models.Logro;
import models.Pista;
import models.Reserva;
import models.Socio;

import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.content.res.Resources;

public class BoleraJSONParser {

	BoleraWebserviceInvoker DAO;
	Resources res;

	public BoleraJSONParser(Resources res) {
		this.res = res;
		DAO = new BoleraWebserviceInvoker(res);
	}

	public BoleraJSONParser() {
		DAO = new BoleraWebserviceInvoker();
	}

	public static Horario parseHorario(JSONObject object) {
		return null;
	}

	/**
	 * Metodo con el cual parseamos una reserva
	 * 
	 * @param object
	 *            recibimos como parametro un objeto JSON
	 * @return
	 */
	public static Reserva parseReserva(JSONObject object) {
		Reserva reserva = new Reserva();
		try {
			reserva.setId(object.getInt("id"));
			Pista pista = new Pista();
			pista.setNumero(object.getInt("pista"));
			reserva.setPista(pista);
			reserva.setAnulado(object.getBoolean("anulado"));
			Socio socio = new Socio();
			socio.setId(object.getInt("id_socio"));
			reserva.setSocio(socio);
			Empleado empleado = new Empleado();
			empleado.setId(object.getInt("id_empleado"));
			reserva.setEmpleado(empleado);
			//
			SimpleDateFormat formatoDeFecha = new SimpleDateFormat(
					"yyyy-MM-dd hh:mm:ss");
			try {
				reserva.setFecha(formatoDeFecha.parse((object
						.getString("fecha"))));
			} catch (ParseException e) {
				e.printStackTrace();
			}

		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return reserva;
	}

	public static Socio parseSocio(JSONObject jsonObject) {
		Socio socio = new Socio();
		try {
			socio.setId(jsonObject.getInt("idsocio"));
			socio.setNombre(jsonObject.getString("nombre"));
			socio.setApellido1(jsonObject.getString("apellido1"));
			socio.setApellido2(jsonObject.getString("apellido2"));
			
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return socio;
	}

	/**
	 * metodo que recibe la reserva y devuelve una pista
	 * 
	 * @param reserva
	 * @return
	 */
	public static List<NameValuePair> getJSONReserva(Reserva reserva) {
		List<NameValuePair> valores = new ArrayList<NameValuePair>();
		valores.add(new BasicNameValuePair("funcion", "1"));
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
		valores.add(new BasicNameValuePair("fecha", ""
				+ sdf.format(reserva.getFecha())));
		valores.add(new BasicNameValuePair("anulado", "" + reserva.getAnulado()));
		valores.add(new BasicNameValuePair("socio", ""
				+ reserva.getSocio().getId()));
		Integer empleado = null;
		if (reserva.getEmpleado() != null) {
			empleado = reserva.getEmpleado().getId();
		}
		valores.add(new BasicNameValuePair("empleado", "" + empleado));
		valores.add(new BasicNameValuePair("franja", ""
				+ reserva.getFranja().getId()));
		valores.add(new BasicNameValuePair("pista", ""
				+ reserva.getPista().getNumero()));
		return valores;
	}

	public static Logro parseLogro(JSONObject jsonObject) {
		Logro logro = new Logro();
		try {
			logro.setId(jsonObject.getInt("idlogro"));
			logro.setNombreSocio(jsonObject.getString("socio"));
			logro.setDescripcion(jsonObject.getString("descripcion"));
			logro.setPuntuacion(jsonObject.getInt("puntos"));
			logro.setImagenURL(jsonObject.getString("URL"));
			logro.setNombre(jsonObject.getString("logro"));
			logro.setCantidadLogrosSocio(jsonObject.getInt("logrosSocio"));// hay
			logro.setCantidadLogrosTotales(jsonObject.getInt("totalLogros"));

		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		// TODO Auto-generated method stub
		return logro;
	}

	public String doLogin(String user, String password, String clave) {
		String result = null;
		// Ejecutar WS con los datos
		JSONObject datos = DAO.executeLogin(user, password, clave);
		// Ejecutar WS con los datos END//
		// Parseo de datos
		if (datos != null) {
			try {
				result = datos.getString("login");
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		} else {
			result = "NPExc";
		}
		// Parseo de datos END//
		return result;
	}
	
	public String modUsuario(String usu, String pass, String newpass){
		String resultado=null;
		JSONObject dat = DAO.modifUsuario(usu, pass, newpass);
		if(dat != null){
			try{
				resultado = dat.getString("id");
			} catch (JSONException e){
				e.printStackTrace();
			}
		
		}else{
			
			resultado="NullPExc";
		}
		return resultado;
	}

	

	public static Franja parseFranja(JSONObject jsonObject) {
		// creamos un objeto franja
		Franja franja = new Franja();

		List<Franja> franjas = null;
		try {
			// establecemos el id
			franja.setId(jsonObject.getInt("id"));
			// formateamos la fecha de manera que el sql la acepte
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
			// le damos el formato a nuestas variables fecha_inicio y fecha_fin

			franja.setFechaInicio(sdf.parse(jsonObject
					.getString("fecha_inicio")));
			franja.setFechaFin(sdf.parse(jsonObject.getString("fecha_fin")));

		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return franja;
	}

	/**
	 * Este m�todo retorna un array list con todos los alquileres de material
	 * Pendientes de devolver
	 * 
	 * @param id
	 *            Id del usuario
	 * @param server
	 *            Url del servidor + api folder
	 * @return ArrayList<Alquiler> o array de objetos modelo de Alquiler con los
	 *         alquileres pendientes
	 */
	public ArrayList<Alquiler> getAlquileresById(String id, String server) {
		ArrayList<Alquiler> result = new ArrayList<Alquiler>();
		String json = "";
		HttpResponse response = DAO.getAlquileresById(id, server);
		if (response != null) {
			BufferedReader reader;
			try {
				reader = new BufferedReader(new InputStreamReader(response
						.getEntity().getContent(), "UTF-8"));
				json = reader.readLine();
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalStateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			JSONObject objetoJson;
			JSONArray array = null;
			try {
				objetoJson = new JSONObject(json);
				array = objetoJson.getJSONArray("alquileres");
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				// e.printStackTrace();
			}
			if (array != null) {
				for (int a = 0; a < array.length(); a++) {
					Alquiler alquiler = new Alquiler();
					SimpleDateFormat formatoDelTexto = new SimpleDateFormat(
							"yyyy-MM-dd");
					try {
						alquiler.setSocio(array.getJSONObject(a).getString(
								"socio"));
						alquiler.setIdAccesorio(array.getJSONObject(a)
								.getString("idAccesorio"));
						alquiler.setIdAlquiler(array.getJSONObject(a)
								.getString("idAlquiler"));
						alquiler.setDevuelto(array.getJSONObject(a).getBoolean(
								"devuelto"));
						alquiler.setFechaDevolucion(formatoDelTexto.parse(array
								.getJSONObject(a).getString("")));
						alquiler.setSocio(array.getJSONObject(a).getString(
								"socio"));
					} catch (JSONException e) {
						// TODO Auto-generated catch block
						// e.printStackTrace();
					} catch (ParseException e) {
						// TODO Auto-generated catch block
						// e.printStackTrace();
					}
					result.add(alquiler);
				}
			}
		}
		return result;
	}

	public ArrayList<AlquilerDetalle> getAlquilerDetallesById(String id,
			String server) {
		ArrayList<AlquilerDetalle> result = new ArrayList<AlquilerDetalle>();
		String json = "";
		HttpResponse response = DAO.getAlquilerDetallesById(id, server);
		if (response != null) {
			BufferedReader reader;
			try {
				reader = new BufferedReader(new InputStreamReader(response
						.getEntity().getContent(), "UTF-8"));
				json = reader.readLine();
			} catch (UnsupportedEncodingException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalStateException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			JSONObject objetoJson;
			JSONArray array = null;
			try {
				objetoJson = new JSONObject(json);
				array = objetoJson.getJSONArray("alquileres");
			} catch (JSONException e) {
				// TODO Auto-generated catch block
				// e.printStackTrace();
			}
			if (array != null) {
				for (int a = 0; a < array.length(); a++) {
					AlquilerDetalle alquiler = new AlquilerDetalle();
					try {
						alquiler.setNombre(array.getJSONObject(a).getString(
								"nombre"));
						alquiler.setDevuelto(array.getJSONObject(a).getBoolean(
								"devuelto"));
						alquiler.setFechaFin(array.getJSONObject(a).getString(
								"fechaFin"));
						alquiler.setFechaInicio(array.getJSONObject(a)
								.getString("fechaInicio"));
						alquiler.setPvp(array.getJSONObject(a).getInt("pvp"));
					} catch (JSONException e) {
						// TODO Auto-generated catch block
						// e.printStackTrace();
					}
					result.add(alquiler);
				}
			}
		}
		return result;
	}

	public ArrayList<Reserva> getReservasDePistaById(String id, String server) {
		ArrayList<Reserva> reservas = new ArrayList<Reserva>();
		HttpResponse response = DAO.getReservasDePistaById(id, server);
		// LECTURA DE LA RESPUESTA
		BufferedReader reader;
		try {
			reader = new BufferedReader(new InputStreamReader(
					response.getEntity().getContent(), "UTF-8"));
			String json = reader.readLine();
			JSONObject jsonObj = new JSONObject(json);
			JSONArray array = jsonObj.getJSONArray("reservas");
			for (int i = 0; i < array.length(); i++) {
				Reserva reserva = new Reserva();
				reserva.setId(array.getJSONObject(i).getInt("id"));
				Pista pista = new Pista();
				pista.setNumero(array.getJSONObject(i).getInt("pista"));
				reserva.setPista(pista);
				SimpleDateFormat formatoDelTexto = new SimpleDateFormat("yyyy-MM-dd");
				reserva.setFecha(formatoDelTexto.parse(array.getJSONObject(i).getString("fecha")));
				reservas.add(reserva);
			}
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IllegalStateException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (JSONException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (ParseException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		// LECTURA DE LA RESPUESTA
		return reservas;
	}
}
